#ifndef __CMDFUNC__
#define __CMDFUNC__

#include "54func.h"
#define TRAINLEN 1000

// server的实际根目录
extern const char *rootDir;

// 结构体定义
// 用于接收C的字符串cmd
typedef struct {
    char cmdToken[6];
    int argc;
    char argv1[1024];
    char argv2[1024];
} cmd_t;

// cwd栈的结点(双向链表)
typedef struct pathToken_s{
    char data[255];
    struct pathToken_s *pfront; 
    struct pathToken_s *pnext; 
} pathToken_t;

// cwd栈
typedef struct {
    pathToken_t *top;
    pathToken_t *bottom;
    int size;
} cwd_t;

// 小火车
typedef struct train_s
{
    int length;
    char data[TRAINLEN];
} train_t;


// 辅助函数
// recvn                                                                                                                                   
int recvn(int netfd, void *buf, int length);
// 判断路径是否和传入类型匹配
// 传入S_IFREG(普通文件)或S_IFDIR(目录)判断类型
int pathJudge(const char* realPath, mode_t mode);
// 初始化栈
int cwdInit(const char* username, cwd_t **ppcwd);
// 获取cwd, 并将其存储在pwdstr中 
int getPath(const cwd_t *pcwd, char *pwdstr);
// 根据传入的路径(cmd_t结构体中的一个argv字符串,可相对可绝对)
// 获取真实的Linux绝对路径存入realPath中
int realPath(const cwd_t *pcwd, const char *argv, char *realPath);
// 接收确认信息'e'或'o', 信息为'o'时返回1, 为'e'时读取报错信息, 返回0
int recvMsg(int sockfd, train_t* ptrain);
// 用小火车发送字符串
int strSend(int netfd, train_t* ptrain, const char* str);
// 发送成功信息'o'
int successSend(int netfd);
// 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
// 如果填入字符串, 将其作为报错信息发送给客户端
int errorSend(int netfd, const char* errorMsg);



// 指令函数
// 传入cmd_t，解析并执行相应的指令函数,传入cwd_t为指令函数传参
int cmdServerHandler(int netfd, cwd_t **ppcwd, const cmd_t *pcmd);
// 获取cwd, 并将其发送给客户端
int pwdCmd(int netfd, const cwd_t *pcwd);
// cd指令,修改cwd栈,cmd_t获取指令及参数
int cdCmd(int netfd, cwd_t *pcwd, const cmd_t *pcmd);
// ls指令,cwd_t获取cwd,cmd_t获取指令及参数
int lsCmd(int netfd, const cwd_t *pcwd, const cmd_t *pcmd);
// rm指令,cwd_t获取cwd,cmd_t获取指令及参数
int rmCmd(int netfd, const cwd_t *pcwd, const cmd_t *pcmd);
// mkdir指令,cwd_t获取cwd,cmd_t获取指令及参数
int mkdirCmd(int netfd, const cwd_t *pcwd, const cmd_t *pcmd);

// 发送文件,cwd_t获取cwd,cmd_t获取指令及参数
int serverPuts(int netfd, const cwd_t *pcwd, const cmd_t *pcmd);
// 接收文件,cwd_t获取cwd,cmd_t获取指令及参数
int serverGets(int netfd, const cwd_t *pcwd, const cmd_t *pcmd);

// 登录用户,cmd_t获取指令及参数
int userLogin(int netfd, cwd_t** ppcwd, const cmd_t *pcmd);
// 创建用户,cmd_t获取指令及参数
int userAdd(int netfd, const cmd_t *pcmd);
// 退出登录
int userLogout(int netfd, cwd_t** ppcwd, const cmd_t* pcmd);

#endif
